﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using DataAccessComponents;
using System.Collections.ObjectModel;

namespace BusinessLogicLayer
{
    public class Klient_RezerwacjaBL
    {
        private DbOperations dal = new DbOperations();

        /// <summary>
        /// Funkcja dodająca
        /// </summary>
        /// <param name="objDodaj">Obiekt do dodania</param>
        /// <returns>Ideks dodanego wiersza</returns>
        public int dodaj(Klient_Rezerwacja objDodaj)
        {
            return dal.dodajKlient_Rezerwacja(objDodaj);
        }

        /// <summary>
        /// Funkcja usuwająca
        /// </summary>
        /// <param name="idusun">Id obiektu do usuniecia</param>        
        public void usun(int idusun)
        {
            dal.usunKlient_Rezerwacja(idusun);
        }

        /// <summary>
        /// Funkcja aktualizująca podany obiekt w bazie danych
        /// </summary>
        /// <param name="objAktualizuj">Obiekt zaktualizowany</param>
        public void aktualizuj(Klient_Rezerwacja objAktualizuj)
        {
            KlientBL klientBL = new KlientBL();
            StatusBL statusBL = new StatusBL();
            klientBL.aktualizuj(objAktualizuj.Klient);
            statusBL.aktualizuj(objAktualizuj.Status);

            

            dal.aktualizujKlient_Rezerwacja(objAktualizuj);
        }

        /// <summary>
        /// Funkcja zwracająca obiekt o podanym id
        /// </summary>
        /// <param name="idpobierz">Id obiektu do zwrocenia</param>
        /// <returns></returns>
        public Klient_Rezerwacja pobierz(int idpobierz)
        {
            KlientBL klientBL = new KlientBL();
            StatusBL statusBL = new StatusBL();
            Klient_Rezerwacja klienRezerwacja = dal.pobierzKlient_Rezerwacja(idpobierz);

            klienRezerwacja.Klient = klientBL.pobierz(klienRezerwacja.Id_klient);
            klienRezerwacja.Status = statusBL.pobierz(klienRezerwacja.Id_status);

            return klienRezerwacja;
        }

        /// <summary>
        /// Funkcja zwraca liste obiektów
        /// </summary>
        /// <returns>Lista obiektów</returns>
        public ObservableCollection<Klient_Rezerwacja> pobierzListe()
        {
            ObservableCollection<Klient_Rezerwacja> lista = dal.pobierzListeKlient_Rezerwacja();
            KlientBL klientBL = new KlientBL();
            StatusBL statusBL = new StatusBL();

            foreach (Klient_Rezerwacja kr in lista)
            {
                kr.Klient = klientBL.pobierz(kr.Id_klient);
                kr.Status = statusBL.pobierz(kr.Id_status);

            }
            return lista;
        }

        /// <summary>
        /// Funkcja zwraca liste obiektów
        /// </summary>
        /// <returns>Lista obiektów</returns>
        public ObservableCollection<Klient_Rezerwacja> pobierzListe(int idrezerwacja)
        {
            ObservableCollection<Klient_Rezerwacja> lista = dal.pobierzListeKlient_Rezerwacja(idrezerwacja);
            KlientBL klientBL = new KlientBL();
            StatusBL statusBL = new StatusBL();

            foreach (Klient_Rezerwacja kr in lista)
            {
                kr.Klient = klientBL.pobierz(kr.Id_klient);
                kr.Status = statusBL.pobierz(kr.Id_status);

            }
            return lista;
        }

        /// <summary>
        /// Funkcja aktualizująca obiekty w bazie obiektami z listy
        /// </summary>
        /// <param name="lista">Lista obiektow</param>
        /// <returns>True gdy operacja przebiegła poprawnie</returns>
        public bool aktualizujListe(ObservableCollection<Klient_Rezerwacja> lista)
        {
            KlientBL klientBL = new KlientBL();
            StatusBL statusBL = new StatusBL();
            ObservableCollection<Klient_Rezerwacja> listaKlientowRezerwacja = new ObservableCollection<Klient_Rezerwacja>();

            listaKlientowRezerwacja = this.pobierzListe();

            foreach (Klient_Rezerwacja klient_rezerwacja in lista)
            {
                // Sprawdzanie czy klient i rezeracja znajdują się już w bazie
                bool czy_jest = false;
                foreach (Klient_Rezerwacja kr in listaKlientowRezerwacja)
                {
                    if (kr.Id_klient == klient_rezerwacja.Id_klient && kr.Id_rezerwacja == klient_rezerwacja.Id_rezerwacja)
                    {
                        czy_jest = true;
                        break;
                    }
                }
                if (czy_jest == false)
                {
                    this.dodaj(klient_rezerwacja);
                }
                else
                {
                    this.aktualizuj(klient_rezerwacja);
                    klientBL.aktualizuj(klient_rezerwacja.Klient);
                    statusBL.aktualizuj(klient_rezerwacja.Status);
                }
            }
            return true;
        }

        /// <summary>
        /// Funkcja usuwa obiekt z bazy danych na podstawie obiektów z listy
        /// </summary>
        /// <param name="lista">Lista obiektów do usuniecia</param>
        /// <returns>True gdy operacja przebiegła poprawnie</returns>
        public bool usun(ObservableCollection<Klient_Rezerwacja> lista)
        {
            ObservableCollection<Klient_Rezerwacja> listaKlientowRezerwacja = new ObservableCollection<Klient_Rezerwacja>();

            listaKlientowRezerwacja = this.pobierzListe();

            foreach (Klient_Rezerwacja klient_rezerwacja in lista)
            {
                // Sprawdzanie czy klient i rezeracja znajdują się już w bazie
                bool czy_jest = false;
                foreach (Klient_Rezerwacja kr in listaKlientowRezerwacja)
                {
                    if (kr.Id_klient == klient_rezerwacja.Id_klient && kr.Id_rezerwacja == klient_rezerwacja.Id_rezerwacja)
                    {
                        czy_jest = true;
                        break;
                    }
                }
                if (czy_jest == true)                    
                {
                    this.usun(klient_rezerwacja.Id_klient);
                }               
            }
            return true;            
        }

        public bool usunRezerwacja(int idrezerwacja)
        {
            dal.usunKlient_RezerwacjaPoIdRezerwacji(idrezerwacja);
            return true;
        }
    }


    
}
